package com.syedu.day11;

/**
 * description：java.lang.String是一个不可变的类,所以Java又提供了两个不同的动态字符串类(弹性字符串)
 *
 * java.lang.StringBuilder
 * java.lang.StringBuffer
 *
 * StringBuilder和StringBuffer的区别
 * 相同点: 这两个类的功能几乎是完全一样的
 * 不同点: StringBuilder是性能较高,但是多线程环境下不安全
 *        StringBuffer是性能较低,但是多线程环境下是安全的
 *
 * @author Administrator
 * @date 2022/3/24 11:08
 */
public class StringBuilderDemo {
    public static void main(String[] args) {
        //创建StringBuilder对象
        //注意:如果使用空参构造,则默认16个容量,如果使用字符串来构建,则容量为初始16 + 初始字符串长度
        StringBuilder stringBuilder = new StringBuilder("abc");

        /**
         * 0.获取字符串容量
         * 注意: 弹性容器在初始化时会默认分配一个容量,StringBuilder默认初始容量为16个字符,
         * 如果容器容量撑满,则会自动扩容为(原来+1)的一倍
         */
        System.out.println(stringBuilder.capacity());//16 + 3
        //获取字符串长度(字符数)
        System.out.println(stringBuilder.length());//3

        //1.拼接字符串
        //注意: StringBuilder的操作是针对原始字符串的操作
        stringBuilder.append("def").append("def").append("def").append("def").append("def").append("de");
        System.out.println(stringBuilder);

        System.out.println(stringBuilder.capacity());

        //2.删除指定范围区间的字符串,前闭后开
        //stringBuilder.delete(0,3);

        //根据下标删除指定字符
        //stringBuilder.deleteCharAt(0);

        //3.插入方法
        stringBuilder.insert(1, "ABC");

        /**
         * 4.替换方法
         * 注意: 这个替换方法和String中的替换方法是不同的!!!
         *
         * String中的replace方法是两个参数,把所有符合A参数的内容都替换成B参数的内容
         * StringBuilder中的replace方法是三个参数,把指定区间(前闭后开)中的内容替换成指定内容.
         */
        stringBuilder.replace(0, 3, "AAA");
        System.out.println(stringBuilder);

        //5.反转字符串
        stringBuilder.reverse();
        System.out.println(stringBuilder);

        /**
         * 6.压缩字符串存储容量
         * 注意: 由于弹性容器实际存储的容量往往会大于真正数据的容量,所以比较浪费资源,所以我们可以通过这个方法来进行压缩
         */
        stringBuilder.trimToSize();
        System.out.println(stringBuilder.capacity());
    }

    /**
     * Java原生反转字符串的方式
     */
    public String reverseStr(String str){
        //把String转成StringBuilder,然后调用反转方法,再转换回String
        return new StringBuilder(str).reverse().toString();
    }
}